home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-02 / objtba.zip / OBJTBASE.MNL < prev    next >
Text File  |  1993-01-04  |  56KB  |  1,435 lines

  1.    
  2.    
  3.                                ObjectBase Users Guide    Page  1    
  4.    
  5.    
  6.    
  7.    
  8.    
  9.    
  10.    
  11.    
  12.    
  13.    
  14.    
  15.    
  16.    
  17.    
  18.    
  19.         ************************************************************
  20.         *                                                          *
  21.         *                 --<<< ObjectBase >>>--                   *
  22.         *                                                          *
  23.         *  The Object Oriented Data Base Management Tool Box for   *
  24.         *                Turbo Pascal version 5.5.                 *
  25.         *                                                          *
  26.         *                    COPYRIGHT NOTICE                      *
  27.         *                                                          *
  28.         *         MMGR.EXE, MMGR.PAS, ObjectBase ToolBox and       *
  29.         *         DBObjects ToolBox and the documentation          *
  30.         *         included are (c) 1990 Thomas W. Harden,          *
  31.         *         all rights reserved.                             *
  32.         *                                                          *
  33.         *         ObjectBase and  DBObjects ToolBoxes are          *
  34.         *         Shareware products and are made available        *
  35.         *         to the programmer to test and use for            *
  36.         *         evaluation purposes only. They may not be        *
  37.         *         circulated in any incomplete or modified         *
  38.         *         form, nor sold for profit, without the           *
  39.         *         express written consent of the author.           *
  40.         *                                                          *
  41.         ************************************************************
  42.        
  43.    
  44.                                ObjectBase Users Guide    Page  2    
  45.    
  46.    
  47.    
  48.    SHAREWARE NOTICE:
  49.    
  50.    ObjectBase and DBObjects ToolBoxes are Shareware products and are 
  51.    made available to the programmer to test and use for evaluation 
  52.    purposes only.  Should you find them useful, register your use 
  53.    with Harden Consulting so update information and future product 
  54.    offerings can be made available to you.  To register your use of 
  55.    the above mentioned products, send check or money order for 
  56.    $79.95 payable to Thomas W.  Harden or Harden Consulting and the 
  57.    form found at the end of this documentation.  When Registration 
  58.    is received you will receive the latest version of ObjectBase 
  59.    (See specifications section for current enhancements),  full 
  60.    documentation plus announcements of upgrades will be mailed to 
  61.    you with special pricing made available to registered owners.
  62.    
  63.    
  64.    
  65.    DISCLAIMER:
  66.    
  67.    You undertake the use of MMGR.EXE, OopBase.TPU and DBObjt.TPU at 
  68.    your own risk.  The Author and Harden Consulting accept no 
  69.    liability for any damages resulting from its use or misuse.  
  70.    Problem reports and suggestions are appreciated; include a 
  71.    self-addressed, stamped return envelope for a reply if desired.
  72.        
  73.    
  74.                                ObjectBase Users Guide    Page  3    
  75.    
  76.    
  77.    
  78.    
  79.    
  80.                              TABLE OF CONTENTS
  81.         ---------------------------------------------------
  82.    
  83.         Shareware Notice .............................    2
  84.    
  85.         Disclaimer ...................................    2
  86.    
  87.         Table of Contents ............................    3
  88.    
  89.         Introduction .................................    4
  90.    
  91.         System Requirements ..........................    5
  92.    
  93.         Specifications ...............................    5
  94.    
  95.         Overview .....................................    6
  96.    
  97.         Reference Section ............................   11
  98.    
  99.            Constants .................................   11
  100.    
  101.            Types .....................................   11
  102.    
  103.            Objects ...................................   13
  104.    
  105.            The DB Object .............................   14
  106.    
  107.               Object Methods .........................   14
  108.    
  109.            Other Objects .............................   27
  110.    
  111.         Registration & Order Form ....................   31
  112.        
  113.    
  114.                                ObjectBase Users Guide    Page  4    
  115.    
  116.    
  117.    
  118.                            INTRODUCTION
  119.              ---------------------------------------
  120.    
  121.    ObjectBase and DBObjects are a comprehensive set of Data Base 
  122.    management Tools, written in Turbo Pascal 5.5 to speed up the 
  123.    developement of complex data base applications.
  124.    
  125.    ObjectBase is an Object Oriented Relational Data Base Management 
  126.    system that allows the programmer to spend his time and intellect 
  127.    on the application requirements and not the tedius manipulation 
  128.    of the data files and the records involved.  ObjectBase is 
  129.    designed to relieve the programmer of worrying about the updating 
  130.    of appropriate indexes and manipulating the complicated relations 
  131.    that can sometimes be encountered in data base system design and 
  132.    implementation.
  133.    
  134.    DBObjects is an Object Oriented file management system that 
  135.    contains the parent objects and the low level methods for 
  136.    datafile and indexfile maintenance.
  137.    
  138.    Both are Compiled Units using Borland's Turbo Pascal 5.5.
  139.    
  140.    As helpful as ObjectBase is, it will not do everything for you.  
  141.    It is assumed that proper design has been implemented and that 
  142.    the data structures are in 3rd Normal Form.  If this is true, 
  143.    then ObjectBase should make accessing the Data Structures easy 
  144.    and efficient.
  145.    
  146.    In its present form Object Base points to a memory location 
  147.    passed to it when LoadIndexFile is performed for its index keys.  
  148.    This means that the key value that you want to use must be: 1) a 
  149.    string variable and 2) be a field in the record that is 
  150.    associated with that index.
  151.        
  152.    
  153.                                ObjectBase Users Guide    Page  5    
  154.    
  155.    
  156.    
  157.                             SYSTEM REQUIREMENTS
  158.                ------------------------------------------------
  159.                 Computer          -  IBM PC or compatible.
  160.                 Operating System  -  MS-DOS 2.X or later.
  161.                 Language          -  Turbo Pascal 5.5 or Later.
  162.    
  163.    
  164.                                SPECIFICATIONS
  165.            ------------------------------------------------------
  166.            Number of Open Files ......................         15 *
  167.            Number of Fields ..........................  unlimited
  168.            Maximum size of record .................... 1024 bytes
  169.            Maximum number of records per file ........        100 *
  170.            Number of relationships ................... limited by
  171.                                                   computer memory
  172.            
  173.         *  This version is intentionally limited in its capacity.  
  174.    
  175.            The DB Object contained with this UNIT is not 
  176.            extensible. The version supplied upon registration has 
  177.            several changes.
  178.    
  179.            Number of Open Files ...................... Limited by
  180.                                                        CONFIG.SYS
  181.                                                         FILES = n
  182.                                                       7 < n < 255
  183.            Number of records per file ................  2.14x10^9
  184.            Object is extendable.
  185.            With MS-DOS 3.x ...........................    NetWork 
  186.                                                             Ready
  187.        
  188.    
  189.                                ObjectBase Users Guide    Page  6    
  190.    
  191.    
  192.    
  193.                                   OVERVIEW
  194.                   ---------------------------------------
  195.    
  196.        ObjectBase was designed to increase the productivity of 
  197.        programmers in implementation of complex data base 
  198.        applications.  The concept of Object Oriented Programming is 
  199.        particularly suited to this genre of developement.  By 
  200.        defining the database as an Object with all the knowledge 
  201.        built in to manipulate the data following the relational 
  202.        model, the programmer is relieved of much of the tedium 
  203.        normally associated with maintaining the integrity of the 
  204.        files and their associated indexes.  Also the system allows 
  205.        for the easy setup of relationships between the different 
  206.        data files giving the database as a whole the relational 
  207.        integrity required by serious database systems.
  208.    
  209.        ObjectBase provides the programmer much of the functionality 
  210.        of a Data Base Management System, i.e. dBase, with the 
  211.        flexibility and speed of Pascal.
  212.    
  213.        ObjectBase consists of two related Units: OopBase.TPU and 
  214.        DBObjt.TPU.  The DBObjt Unit is a set of low level Data File 
  215.        management Objects.  It handles the basic housekeeping chores 
  216.        for datafiles and the index files or any untyped file that 
  217.        uses fixed length records. OopBase defines the more 
  218.        inteligent DFile Object that is aware of how it is indexed 
  219.        and manages the basic handling of an indexed data file. The 
  220.        primary object for ObjectBase, is the DB object.  This the 
  221.        object that the programmer will deal with on a regular basis. 
  222.        It is aware of all the information required to manage the 
  223.        database without the programmer being required to deal with 
  224.        the low level tedium of being sure all the indexes are 
  225.        updated, etc.  
  226.    
  227.        The DB object is informed of the data and index files that 
  228.        will be included in its data base.  As state earlier, the 
  229.        data and index files are also Objects that have been informed 
  230.        of the source of their data and have been given the know how 
  231.        to be self maintaining.  What I mean by this is the Index 
  232.        File Object is aware of the spot in system memory where its 
  233.        Key value is located and knows what to do with it.  The Data 
  234.        File Object knows which indexes are associated with the data 
  235.        file and also knows where its data buffer is located.  The DB 
  236.        Object knows which Data Files belong to the DataBase and how 
  237.        they relate to each other.  By endowing the DB Object with 
  238.        this knowledge, it can now handle most of the maintenance 
  239.        chores with which the programmer normally has to contend.
  240.        
  241.    
  242.                                ObjectBase Users Guide    Page  7    
  243.    
  244.    
  245.    
  246.        For instance, when a record is edited, before putting the 
  247.        record back in the database the datafile checks to see if 
  248.        their has been a change in its data buffer if so it then 
  249.        stores the modified copy of the record over the old copy and 
  250.        calls on its indexes to do the same.  They in turn compare 
  251.        the current values of their databuffer with the data that was 
  252.        originally present and will update their index structure 
  253.        accordingly.  What this means to the programmer is that he is 
  254.        no longer required to deal with the tedium of insuring that 
  255.        all files have been updated.
  256.    
  257.        The relational aspects are also handled by the DB Object.  
  258.        Once informed of the relationships required for a particular 
  259.        application or procedure a call to associate will fill the 
  260.        various record buffers with related data.  If the 
  261.        relationship is a one to many relationship you can use next 
  262.        association to step through the related records.  It makes 
  263.        the associations appear to be a circular Queue.
  264.    
  265.        What all this means is that much of the functionality (and 
  266.        even more) of DBMS systems is provided with the ability to 
  267.        control the environment and interface to the user with the 
  268.        power of Turbo Pascal.
  269.    
  270.        The normal sequence of code required to use ObjectBase is:
  271.     
  272.            1) Declare a variable of type DB.
  273.    
  274.               Example: var DataBase : DB;
  275.    
  276.            2) Initialize the DB variable.
  277.    
  278.               Example: DataBase.Init;
  279.    
  280.            3) Load the Data Files into the variable.
  281.    
  282.               Example: DataBase.LoadDataFile(New(DFilePtr,
  283.                        Init('COMPANY.DAT','C:\MMGR\',SizeOf(Company),
  284.                        @Company)));
  285.                        
  286.            4) Load the Index Files into the variable.
  287.    
  288.               Example: DataBase.LoadIndexFile(New(IFilePtr,
  289.                        Init('COMPCODE.NDX','C:\MMGR\',
  290.                            SizeOf(Company.Code), @Company.Code),
  291.                           'COMPANY.DAT'));
  292.    
  293.            5) Open the Data Base Variable.
  294.    
  295.               Example: DataBase.Open;
  296.    
  297.            6) Load the Relationships between the files into the 
  298.               variable for the various applications encountered in 
  299.               the target application.
  300.    
  301.    
  302.    
  303.                                ObjectBase Users Guide    Page  8    
  304.    
  305.    
  306.        
  307.    
  308.                                ObjectBase Users Guide    Page  9    
  309.    
  310.    
  311.               Example: DataBase.LoadRelation('COMPANY.DAT',
  312.                                              'CONTACTS.DAT', 
  313.                                              'CONTCMPCD.NDX', 
  314.                                               @Company.Code);
  315.               Example: DataBase.ClearRelations;
  316.    
  317.            7) Perform the Required Manipulations of the data files 
  318.               based on the demands of the application.
  319.    
  320.               Examples: DataBase.Find(aString);
  321.                         DataBase.Search(aString);
  322.                         DataBase.Next;
  323.                         DataBase.Prev;
  324.                         DataBase.Add;
  325.                         DataBase.Delete;
  326.                         DataBase.Associate('COMPANY.DAT');
  327.                         DataBase.NextAssoc('COMPANY.DAT');
  328.    
  329.             8) Tell the Object that you are Done with it.
  330.    
  331.                Example: DataBase.Done;
  332.    
  333.        What ObjectBase does:
  334.    
  335.        Once the datafile is loaded into DB variable, the record 
  336.        variable representing the data stored in that specific data 
  337.        file is known to the DB Object and when a request is made for 
  338.        a different record, DB performs the required updates to the 
  339.        current record and its indexes and then performs the 
  340.        requested action and loads the record variable with the 
  341.        associated data. If the application requires the use of 
  342.        multiple data files, then relations should be loaded.  Once 
  343.        loaded a message to associate will align the files properly 
  344.        and provide the appropriate data to the application.  This is 
  345.        demonstrated in the Pascal Code for MMGR.EXE included in this 
  346.        package.  Once all the Data and Indexes are loaded into the 
  347.        DB Object the progam can SwitchTo any of the DataFiles to 
  348.        make that the primary Data File and SwitchIndex's to any 
  349.        loaded index so that the order of the records will reflect 
  350.        the order desired.
  351.    
  352.        An alternative method would be to declare each data file and 
  353.        index file as variables of the types DFile and IndexFile, 
  354.        Init(ialize) these objects and load the IndexFile Pointers 
  355.        into the DFile Object.  Once this is done, several DB objects 
  356.        may be declared with the required set of files and relations 
  357.        utilized in different areas of the program by loading 
  358.        pointers to the DFile objects into each instance of the DB 
  359.        object and loading the relations required for each instance 
  360.        of the DB object.  Each section that has a different 
  361.        perspective on the Data would have its own Data base to work 
  362.        with and would further enhance the integrety and security of 
  363.        the datafiles because each instance of DB would have access 
  364.        only to the data required to perform its function.  Also, 
  365.        switching between the different applications would be 
  366.        facilitated.
  367.    
  368.    
  369.                                ObjectBase Users Guide    Page  10   
  370.    
  371.    
  372.    
  373.    Note:
  374.        If after the program has been in use for a while, and a 
  375.        modification is required that would add a new index, all you 
  376.        have to do is add the LoadIndexFile command for that index 
  377.        and the next time the program runs it will create the new 
  378.        index and build it automatically.
  379.    
  380.        See the README.DOC file for the name of the files containing 
  381.        the annotated code for MMGR.EXE.
  382.    
  383.        
  384.    
  385.                                ObjectBase Users Guide    Page  11   
  386.    
  387.    
  388.    
  389.                              REFERENCE SECTION
  390.                   ---------------------------------------
  391.    
  392.        The following section is broken up into categories based on the 
  393.        identifier Class.  Constants, Types, Objects (a kind of Type), 
  394.        Variables and Global Functions.  The various identifiers are 
  395.        described as to their use within the scope of the toolboxes 
  396.        and how to put them to work for you in your next database 
  397.        developement project.
  398.    
  399.                 ------------  TYPED CONSTANTS  -------------
  400.    
  401.        Constant Name    Value   Description                  Unit Name
  402.        ---------------------------------------------------------------
  403.        NoDups         =    0    May be used to tell the       DBObjt
  404.                                 index file object that 
  405.                                 duplicate keys are not 
  406.                                 allowed.                         
  407.        DupsOK         =    1    May be used to tell the       DBObjt
  408.                                 index file object that 
  409.                                 duplicate keys are 
  410.                                 allowed.
  411.    
  412.                   ---------------  TYPES  ---------------
  413.    
  414.        Type Name  Type          Description                  Unit Name
  415.        ---------------------------------------------------------------
  416.        FPointer = Integer       Used for Record Number        DBObjt
  417.                                 References.
  418.        FName = String[12]       The type that should be       DBObjt
  419.                                 used to present FileNames 
  420.                                 to either Unit.
  421.        PName = String[64]       The type that should be       DBObjt
  422.                                 used to pass PathNames to 
  423.                                 either Unit.
  424.        FStat = (Opened,Closed)  Type used to tell the         DBObjt
  425.                                 whether a file object has 
  426.                                 been opened or closed.
  427.        IFilePtr = ^IndexFile    Memory Pointer to IndexFile   ObjtBase
  428.                                 object.   
  429.        IFPtr = ^IFNode          Memory Pointer to IFNode      ObjtBase
  430.                                 Record.
  431.        IFNode = Record          Record used by the DFile      ObjtBase
  432.          IFP : IFilePtr         Object to maintain it's 
  433.          NextNode : IFPtr       IndexFiles.  It represents a 
  434.                                 node in a linked list 
  435.                                 structure.
  436.        DFilePtr = ^DFile        Memory Pointer to DFile       ObjtBase
  437.                                 Object.
  438.        RelNodePtr = ^RelNode    Memory Pointer to RelNode     ObjtBase
  439.                                 Record.
  440.        
  441.    
  442.                                ObjectBase Users Guide    Page  12   
  443.    
  444.    
  445.        RelNode = Record         Record used by DB Object to   ObjtBase
  446.          PFName                 administer the Relational
  447.          IFName                 aspects of ObjectBase.  It
  448.          RFName : FName         represents a node in a
  449.          Key    : Pointer       Linked list structure.
  450.          NextRel: RelNodePtr
  451.        DFPtr = ^DFNode          Memory Pointer to DFNode      ObjtBase
  452.                                 Record.
  453.        DFNode = Record          Record used by DB Object to   ObjtBase
  454.          DF      : DFilePtr     keep track of the DataFiles 
  455.          NextNode: DFPtr        associated with the 
  456.                                 DataBase.  Represents a node 
  457.                                 in a linked list.
  458.        
  459.    
  460.                                ObjectBase Users Guide    Page  13   
  461.    
  462.    
  463.    
  464.                   --------------  OBJECTS  --------------
  465.    
  466.        A Word about objects:
  467.    
  468.          This is not intended to be a lesson in object oriented 
  469.          programming but rather a description of how OOP concepts 
  470.          affect the use of ObjectBase.
  471.    
  472.          An Object in TP 5.5 is similar to a Class in C++.  It is 
  473.          used as a Data Variable that encompasses not only the data 
  474.          that is required by the nature of its use but also the 
  475.          knowledge of how to perform actions on itself. The data 
  476.          variables are similar to record fields and are handled 
  477.          accordingly.  The Procedures and functions involved are 
  478.          known as methods in the OOP world.  One of the properties 
  479.          of Objects is that they may pass on their knowledge to 
  480.          other objects via extensibility.  When an object is 
  481.          declared it may reference another object and will inherit 
  482.          all the data and methods contained in that object.
  483.    
  484.        ObjectBase has two Base Object types: OopFile and DB.
  485.    
  486.          DB is the data management object that in effect handles the 
  487.          functions of ObjectBase.  All dialog between the 
  488.          application and the data base is done through DB.
  489.    
  490.          OopFile implements the most basic and low level routines 
  491.          for file handling, i.e.- Open, flushing, closing of file 
  492.          handles; reading and writing to disk files; B+tree index 
  493.          maintenance.
  494.    
  495.        The heiarchy is graphically represented as:
  496.     
  497.                  +- DB --------------------------------+            
  498.                  | +- DFile(DataFile(OopFile)) ----+   |            
  499.                  | |                               |   |            
  500.                  | |  IndexFile(DataFile(OopFile)) |   |            
  501.                  | |                               |   |            
  502.                  | +-------------------------------+   |            
  503.                  +-------------------------------------+
  504.    
  505.              -------------------------------------------------
  506.        
  507.    
  508.                                ObjectBase Users Guide    Page  14   
  509.    
  510.    
  511.    
  512.                             OBJECT DESCRIPTIONS
  513.        ---------------------------------------------------------------
  514.    Name : DB
  515.    
  516.    Unit : ObjtBase
  517.    
  518.    In the following descriptions it is assumed that a variable 
  519.    declaration exists in the program:
  520.    
  521.          Var  DataBase : DB;
  522.    
  523.    
  524.    The following is a list of the methods belonging to the DB 
  525.    object.  They are available to the progammer via calls to the 
  526.    variable you declare as Type DB.  You should limit your access to 
  527.    the methods belonging to The DB Object. The methods are listed 
  528.    in alphabetical order below.  Any thing that normally needs to be 
  529.    done with a data management system is available through the DB 
  530.    object.
  531.    
  532.    METHOD REFERENCES
  533.    
  534.    *****************************************************************
  535.          
  536.    Method Name            : ACTIVEKEY
  537.    
  538.    Unit Declaration       : Function ActiveKey : string
  539.    
  540.    Description            : Returns the String value that the current 
  541.                             record is indexed by based on the Active 
  542.                             Index file.
  543.    
  544.    Input                  : None
  545.    
  546.    OutPut                 : KeyString
  547.    
  548.    Usage                  : OldKey := DataBase.ActiveKey;
  549.    
  550.        
  551.    
  552.                                ObjectBase Users Guide    Page  15   
  553.    
  554.    
  555.    *****************************************************************
  556.    
  557.    Method Name            : ADD
  558.    
  559.    Unit Declaration       : Procedure Add
  560.    
  561.    Description            : Adds a record to the current primary file.  
  562.                             The record will contain the data that resides 
  563.                             in the buffer whose pointer was passed to the 
  564.                             DFile Object when it was initialized in the 
  565.                             LoadDataFile message. Indexes that have 
  566.                             loaded as referencing the primary file will 
  567.                             add the keys that reside in the buffers 
  568.                             passed to them during LoadIndexFile message.
  569.    
  570.    Input                  : None
  571.    
  572.    OutPut                 : None
  573.    
  574.    Usage                  : DataBase.Add;
  575.          
  576.    *****************************************************************
  577.          
  578.    Method Name            : ASSOCIATE
  579.    
  580.    Unit Declaration       : Procedure Associate(F:FName)
  581.    
  582.    Description            : Aligns Record pointers based on the 
  583.                             relations that were loaded with 
  584.                             LoadRelations message from the reference 
  585.                             FileName down to the last relation 
  586.                             loaded.  If No relation is found then 
  587.                             the data buffer of the related file is 
  588.                             blanked so nothing will show if that 
  589.                             record is shown.
  590.    
  591.    Input                  : ParentDataFileName - Starts associtating 
  592.                             at this point in the relationship chain.
  593.    
  594.    OutPut                 : None
  595.    
  596.    Usage                  : DataBase.Associate('COMPANY.DAT');
  597.    
  598.    Alternative Usage      : DataBase.Associate(CompanyData^.FileName)
  599.    
  600.        
  601.    
  602.                                ObjectBase Users Guide    Page  16   
  603.    
  604.    
  605.    *****************************************************************
  606.    
  607.    Method Name            : BLANKRECORD
  608.    
  609.    Unit Declaration       : Procedure BlankRecord
  610.    
  611.    Description            : Initializes the Data Buffer for the currently 
  612.                             active DataFile. This is used to provide a 
  613.                             blank record in which new data can be added 
  614.                             to the primary currently active datafile.
  615.    
  616.    Input                  : None
  617.    
  618.    OutPut                 : None
  619.    
  620.    Usage                  : DataBase.BlankRecord;
  621.    
  622.    *****************************************************************
  623.    
  624.    Method Name            : BOTTOM
  625.    
  626.    Unit Declaration       : Procedure bottom
  627.    
  628.    Description            : Returns the Last record in DataFile relative 
  629.                             to the Selected Index.
  630.    
  631.    Input                  : None
  632.    
  633.    OutPut                 : None
  634.    
  635.    Usage                  : DataBase.Bottom;
  636.    
  637.    *****************************************************************
  638.    
  639.    Method Name            : CLEAR
  640.    
  641.    Unit Declaration       : Procedure Clear
  642.    
  643.    Description            : Any time a DataFile is to be sequentially 
  644.                             accessed Clear should be called.  This points 
  645.                             all internal pointers to the first logical 
  646.                             record in the active datafile.
  647.    
  648.    Input                  : None
  649.    
  650.    OutPut                 : None
  651.    
  652.    Usage                  : DataBase.Clear;
  653.    
  654.        
  655.    
  656.                                ObjectBase Users Guide    Page  17   
  657.    
  658.    
  659.    *****************************************************************
  660.    
  661.    Method Name            : CLEARRELATIONS
  662.    
  663.    Unit Declaration       : Procedure ClearRelations
  664.    
  665.    Description            : Removes relationships that were previously 
  666.                             loaded using LoadRelation so a new set of 
  667.                             relations can be loaded or when independent 
  668.                             access to the datafiles is required.
  669.    
  670.    Input                  : None
  671.    
  672.    OutPut                 : None
  673.    
  674.    Usage                  : DataBase.ClearRelations;
  675.          
  676.    *****************************************************************
  677.    
  678.    Method Name            : CLOSE
  679.    
  680.    Unit Declaration       : Procedure Close
  681.    
  682.    Description            : Close all Files associated with the DB 
  683.                             Object.
  684.    
  685.    Input                  : None
  686.    
  687.    OutPut                 : None
  688.    
  689.    Usage                  : DataBase.Close;
  690.    
  691.    *****************************************************************
  692.    
  693.    Method Name            : DELREC
  694.    
  695.    Unit Declaration       : Procedure DelRec
  696.    
  697.    Description            : Deletes the Record that is currently in the 
  698.                             Data Buffer for the currently selected 
  699.                             datafile.  Record is permanently deleted.
  700.    
  701.    Input                  : None
  702.    
  703.    OutPut                 : None
  704.    
  705.    Usage                  : DataBase.DelRec;
  706.          
  707.        
  708.    
  709.                                ObjectBase Users Guide    Page  18   
  710.    
  711.    
  712.    *****************************************************************
  713.          
  714.    Method Name            : DONE
  715.    
  716.    Unit Declaration       : Destructor Done
  717.    
  718.    Description            : Release the dynamic data storage areas set up 
  719.                             by Init and other interactions with a DB 
  720.                             Object. Should be called at the conclusion of 
  721.                             the a session with a DB type.
  722.    
  723.    Input                  : None
  724.    
  725.    OutPut                 : None
  726.    
  727.    Usage                  : DataBase.Done;
  728.          
  729.    *****************************************************************
  730.    
  731.    Method Name            : EMPTY
  732.    
  733.    Unit Declaration       : Function Empty : Boolean
  734.    
  735.    Description            : Returns TRUE if there are viable records 
  736.                             stored in the active datafile.
  737.    
  738.    Input                  : None
  739.    
  740.    OutPut                 : True / False
  741.    
  742.    Usage                  : IF NOT DataBase.Empty THEN Customer.edit;
  743.    
  744.    *****************************************************************
  745.    
  746.    Method Name            : EOFILE
  747.    
  748.    Unit Declaration       : Function EOFile: Boolean
  749.    
  750.    Description            : Returns TRUE if the most recent data file 
  751.                             movement took the record pointer to the end 
  752.                             of either the active index file or the actual 
  753.                             datafile if their are no active indexes.
  754.    
  755.    Input                  : None
  756.    
  757.    OutPut                 : True/False
  758.    
  759.    Usage                  : DataBase.EOFile;
  760.    
  761.        
  762.    
  763.                                ObjectBase Users Guide    Page  19   
  764.    
  765.    
  766.    *****************************************************************
  767.    
  768.    Method Name            : FILEEXISTS
  769.    
  770.    Unit Declaration       : Function FileExists(Name : FName): Boolean
  771.    
  772.    Description            : Returns TRUE if File referenced by Name has 
  773.                             been loaded into DataBase with LoadDataFile 
  774.                             method.  Use of this function can prevent 
  775.                             crashes if an attempt is made to access an 
  776.                             unknown FileName.
  777.    
  778.    Input                  : DataFileName
  779.    
  780.    OutPut                 : True/False
  781.    
  782.    Usage                  : DataBase.FileExists('COMPANY.DAT');
  783.    
  784.    *****************************************************************
  785.    
  786.    Method Name            : FIND
  787.    
  788.    Unit Declaration       : Procedure Find(S:string)
  789.    
  790.    Description            : Finds an exact match to the KeyString if 
  791.                             exists. Otherwise no action is taken.
  792.    
  793.    Input                  : Search String
  794.    
  795.    OutPut                 : None
  796.    
  797.    Usage                  : DataBase.Find(KeyString);
  798.    
  799.    *****************************************************************
  800.    
  801.    Method Name            : GET
  802.    
  803.    Unit Declaration       : Procedure Get
  804.    
  805.    Description            : Loads the record that is currently being 
  806.                             pointed to by the DB Object.  Not normally 
  807.                             required by application programer since 
  808.                             pointer movements automaticly retrieve the 
  809.                             the record and put it into the buffer passed 
  810.                             to the DB Object when the LoadDataFile 
  811.                             message was sent.
  812.    
  813.    Input                  : None
  814.    
  815.    OutPut                 : None
  816.    
  817.    Usage                  : DataBase.Get;
  818.          
  819.        
  820.    
  821.                                ObjectBase Users Guide    Page  20   
  822.    
  823.    
  824.    *****************************************************************
  825.    
  826.    Method Name            : INIT
  827.    
  828.    Unit Declaration       : Constructor Init
  829.    
  830.    Description            : Initializes the data structures used by the 
  831.                             DB object.  Must be called by main program 
  832.                             for each instance of Type DB.
  833.    
  834.    Input                  : None
  835.    
  836.    OutPut                 : None
  837.    
  838.    Usage                  : DataBase.Init;
  839.    
  840.    *****************************************************************
  841.    
  842.    Method Name            : LASTCODE
  843.    
  844.    Unit Declaration       : Function LastCode(I : FName): String
  845.    
  846.    Description            : Returns the last indexed string in the 
  847.                             current datafiles active index.  This is used 
  848.                             if your system is generating internal access 
  849.                             codes for individual records.  It allows the 
  850.                             creation of sequential codes without 
  851.                             duplications.
  852.    
  853.    Input                  : IndexFileName - Searches this index for 
  854.                             the last key in index.
  855.    
  856.    OutPut                 : LastCode - The Last Code found in 
  857.                             IndexFileName.
  858.    
  859.    Usage                  : Company.code := NextCode(DataBase.LastCode(
  860.                                                     'COMPANY.DAT'));
  861.    Alternative Usage      : Company.code := 
  862.                               NextCode(DataBase.LastCode( 
  863.                                  CompanyData^.FileName));
  864.          
  865.        
  866.    
  867.                                ObjectBase Users Guide    Page  21   
  868.    
  869.    
  870.    *****************************************************************
  871.    
  872.    Method Name            : LOADDATAFILE
  873.    
  874.    Unit Declaration       : Procedure LoadDataFile(D:DFilePtr)
  875.    
  876.    Description            : Tells the DB Object the location of the 
  877.                             DFile object and initializes the DFile 
  878.                             object with information about the 
  879.                             DataFile and the location of the data 
  880.                             buffer to use for its I/O.
  881.    
  882.    Input                  : DFilePtr - Pointer variable to DFile 
  883.                             Object.  In the example below New's 
  884.                             extended capability of returning a 
  885.                             pointer and the ability to call an 
  886.                             Objects constructor is put to use.
  887.                             Dfile's Constructor requires the 
  888.                             following: DataFile Name, the size of 
  889.                             the Data record, a pointer to that 
  890.                             record buffer.
  891.    
  892.    OutPut                 : None
  893.    
  894.    Usage                  : DataBase.LoadDataFile(new(DfilePtr, 
  895.                               init('COMPANY.DAT',Sizeof(Company), 
  896.                               @Company)));
  897.    
  898.    Alternative usage      : VAR CompanyData : DFilePtr;
  899.    
  900.                             new(CompanyData, Init('COMPANY.DAT', 
  901.                             SizeOf(Company), @Company));
  902.                             DataBase.LoadDataFile(CompanyData);
  903.    
  904.        
  905.    
  906.                                ObjectBase Users Guide    Page  22   
  907.    
  908.    
  909.    *****************************************************************
  910.          
  911.    Method Name            : LOADINDEXFILE
  912.    
  913.    Unit Declaration       : Procedure LoadIndexFile(D:IFilePtr; DF : Fname)
  914.    
  915.    Description            : Initializes the IndexFile Object and Passes 
  916.                             a pointer to the DB Object so that it is 
  917.                             aware of which DataFile to associate it with.
  918.    
  919.    Input                  : IFilePtr - (See LoadDataFile). Nodups or 
  920.                             DupsOk inform the IndexFile whether to 
  921.                             allow duplicate keys when a key is added 
  922.                             to an index.
  923.                             The DataFile Name that the index is 
  924.                             associated with.
  925.    
  926.    OutPut                 : None
  927.    
  928.    Usage                  : DataBase.LoadIndexFile(new(IFilePtr, 
  929.                               Init('COMPCODE.NDX',SizeOf(Company.Code), 
  930.                               @Company.code,NoDups)),'COMPANY.DAT');
  931.    
  932.    Alternative usage      : VAR CompSysNdx : IFilePtr;
  933.    
  934.                             New(CompSysNdx, Init('COMPCODE.NDX', 
  935.                             SizeOf(Company.Code), @Company.Code, 
  936.                             NoDups));
  937.                             DataBase.LoadIndexFile(CompSysNdx, 
  938.                             CompanyData^.FileName);
  939.          
  940.    *****************************************************************
  941.    
  942.    Method Name            : LOADRELATION
  943.    
  944.    Unit Declaration       : Procedure LoadRelation(ParentFile,NewData,
  945.                                                    NewIndex : FName;
  946.                                                    NewKey : pointer)
  947.    
  948.    Description            : Informs the DB Object of the relation between 
  949.                             one datafile and another.
  950.    
  951.    Input                  : ParentDataFileName
  952.                             ChildDataFileName
  953.                             Linking IndexFileName
  954.                             Pointer to Key field in Parents Data 
  955.                             buffer.
  956.    
  957.    OutPut                 : None
  958.    
  959.    Usage                  : DataBase.LoadRelation('COMPANY.DAT',
  960.                             'CONTACT.DAT','CONTCPCD.NDX',@Company.code);      
  961.          
  962.        
  963.    
  964.                                ObjectBase Users Guide    Page  23   
  965.    
  966.    
  967.    *****************************************************************
  968.    
  969.    Method Name            : NEXT
  970.    
  971.    Unit Declaration       : Procedure Next
  972.    
  973.    Description            : Returns the next record ordered by the 
  974.                             currently active index for the currently 
  975.                             active DataFile.  If the current record is 
  976.                             the last record in the index then the first 
  977.                             record is returned in the Data Buffer.
  978.    
  979.    Input                  : None 
  980.    
  981.    OutPut                 : None
  982.    
  983.    Usage                  : DataBase.Next;
  984.    
  985.    *****************************************************************
  986.          
  987.    Method Name            : NEXTASSOC
  988.    
  989.    Unit Declaration       : Procedure NextAssoc(F: FName)
  990.    
  991.    Description            : Increments the next datafile record pointer 
  992.                             down the relation chain from F. If no 
  993.                             additional relations exist the first 
  994.                             association available is made.
  995.    
  996.    Input                  : ParentDataFileName - Starts associtating 
  997.                             at this point in the relationship chain. 
  998.                             The next file down the chain is 
  999.                             incremented and then associated with 
  1000.                             files that follow.
  1001.    
  1002.    OutPut                 : None
  1003.    
  1004.    Usage                  : DataBase.NextAssoc('COMPANY.DAT');
  1005.    
  1006.    Alternative Usage      : DataBase.NextAssoc(CompanyData^.FileName)
  1007.    
  1008.        
  1009.    
  1010.                                ObjectBase Users Guide    Page  24   
  1011.    
  1012.    
  1013.    *****************************************************************
  1014.          
  1015.    Method Name            : OPEN
  1016.    
  1017.    Unit Declaration       : Procedure Open
  1018.    
  1019.    Description            : Opens all Files loaded into the DB Object and 
  1020.                             prepares them for processing.  The record 
  1021.                             that is returned is the first physical record 
  1022.                             in the DataFile.
  1023.    
  1024.    Input                  : None
  1025.    
  1026.    OutPut                 : None
  1027.    
  1028.    Usage                  : DataBase.Open;
  1029.          
  1030.    *****************************************************************
  1031.    
  1032.    Method Name            : PREV
  1033.    
  1034.    Unit Declaration       : Procedure Prev
  1035.    
  1036.    Description            : Returns the record that is located just 
  1037.                             before the current record in the selected 
  1038.                             DataFile as ordered by the selected index.  
  1039.                             If it is the first record then the last 
  1040.                             record is returned.
  1041.    
  1042.    Input                  : None
  1043.    
  1044.    OutPut                 : None
  1045.    
  1046.    Usage                  : DataBase.Prev;
  1047.    
  1048.    *****************************************************************
  1049.    
  1050.    Method Name            : PUT
  1051.    
  1052.    Unit Declaration       : Procedure Put
  1053.    
  1054.    Description            : Used to return a modified record to the 
  1055.                             DataFile.  When Put is called all indexes 
  1056.                             associated with this DataFile check to see if 
  1057.                             their key has been modified, if so they 
  1058.                             update themselves.
  1059.    
  1060.    Input                  : None
  1061.    
  1062.    OutPut                 : None
  1063.    
  1064.    Usage                  : DataBase.Put;
  1065.          
  1066.        
  1067.    
  1068.                                ObjectBase Users Guide    Page  25   
  1069.    
  1070.    
  1071.    *****************************************************************
  1072.          
  1073.    Method Name            : SAVE
  1074.    
  1075.    Unit Declaration       : Procedure Save
  1076.    
  1077.    Description            : Writes all files to disk and then resets 
  1078.                             pointers to the records that were active 
  1079.                             when command was given.
  1080.    
  1081.    Input                  : None
  1082.    
  1083.    OutPut                 : None
  1084.    
  1085.    Usage                  : DataBase.Save
  1086.    
  1087.    *****************************************************************
  1088.    
  1089.    Method Name            : SEARCH
  1090.    
  1091.    Unit Declaration       : Procedure Search(S:String)
  1092.    
  1093.    Description            : Searches the currently active IndexFile of 
  1094.                             the currently active dataFile and Finds the 
  1095.                             First record that is equal to or greater than 
  1096.                             the KeyString passed to it.
  1097.    
  1098.    Input                  : Search String
  1099.    
  1100.    OutPut                 : None
  1101.    
  1102.    Usage                  : DataBase.Search(KeyString);
  1103.    
  1104.    *****************************************************************
  1105.    
  1106.    Method Name            : SETINDEX
  1107.    
  1108.    Unit Declaration       : Procedure SetIndex(I : Fname)
  1109.    
  1110.    Description            : Used to change the active index for the 
  1111.                             current DataFile.
  1112.    
  1113.    Input                  : IndexFileName - The name of the index 
  1114.                             file that you want to be controling the 
  1115.                             ordering of the records.
  1116.    
  1117.    OutPut                 : None
  1118.    
  1119.    Usage                  : DataBase.SetIndex('COMPCODE.NDX');
  1120.          
  1121.    Alternative Usage      : DataBase.SetIndex(CompSysNdx.FileName);
  1122.    
  1123.        
  1124.    
  1125.                                ObjectBase Users Guide    Page  26   
  1126.    
  1127.    
  1128.    *****************************************************************
  1129.    
  1130.    Method Name            : SWITCH
  1131.    
  1132.    Unit Declaration       : Procedure Switch(N:integer)
  1133.    
  1134.    Description            : Switchs the active DataFile to the DataFile 
  1135.                             loaded in the n'th position with the 
  1136.                             LoadDataFile method.
  1137.    
  1138.    Input                  : FileNumber - represents the file load 
  1139.                             in the FileNumber Position.
  1140.    
  1141.    OutPut                 : None
  1142.    
  1143.    Usage                  : DataBase.Switch(2);
  1144.          
  1145.    *****************************************************************
  1146.    
  1147.    Method Name            : SWITCHTO
  1148.    
  1149.    Unit Declaration       : Procedure SwitchTo(F:FName)
  1150.    
  1151.    Description            : Used to change the primary DataFile.  The 
  1152.                             DataFile referenced by F will be the datafile 
  1153.                             that is adjusted when a call to Next, add, 
  1154.                             etc. is made.
  1155.    
  1156.    Input                  : DataFileName - Makes DataFileName the 
  1157.                             primary Data File.
  1158.    
  1159.    OutPut                 : None
  1160.    
  1161.    Usage                  : DataBase.SwitchTo('PERSONS.DAT');
  1162.          
  1163.    Alternative Usage      : DataBase.SwitchTo(CompanyData^.FileName);
  1164.    
  1165.    *****************************************************************
  1166.    
  1167.    Method Name            : TOP
  1168.    
  1169.    Unit Declaration       : Procedure top
  1170.    
  1171.    Description            : Returns the first record in DataFile relative 
  1172.                             to the selected Index.
  1173.    
  1174.    Input                  : None
  1175.    
  1176.    OutPut                 : None
  1177.    
  1178.    Usage                  : DataBase.Top;
  1179.    
  1180.    *****************************************************************
  1181.        
  1182.    
  1183.                                ObjectBase Users Guide    Page  27   
  1184.    
  1185.    
  1186.    
  1187.    The following is a listing of the other objects contained within 
  1188.    the UNITs supplied they are not fully documented because you 
  1189.    should not need to access these objects directly since the DB 
  1190.    Object does that for you.  You may use these as you wish but by 
  1191.    doing so you are circumventing what DB does for you.
  1192.    
  1193.        Name : OopFile
  1194.    
  1195.        Unit : DBObjt
  1196.    
  1197.        Description :
  1198.             OopFile is a Base File Object that implements the basic 
  1199.             methods associated with Disc File operations.  The basic file 
  1200.             type that is utilized by the OopFile Object is the Turbo 
  1201.             Pascal untyped File Type.
  1202.    
  1203.        Method List:
  1204.    
  1205.          Constructor Init(NewFileName: FName; NewPath: PName; 
  1206.                           RecordSize: integer)
  1207.          Destructor Done;VIRTUAL
  1208.          Procedure Create;VIRTUAL
  1209.          Procedure Open;VIRTUAL
  1210.          Procedure Close;VIRTUAL
  1211.          Procedure Seek(Pos: FPointer)
  1212.          Procedure Read(Buffer: Pointer; NoBytes:FPointer)
  1213.          Procedure Write(Buffer: Pointer; NoBytes:FPointer)
  1214.          Procedure Append(Buffer: Pointer; NoBytes:FPointer)
  1215.          Procedure Flush
  1216.          Procedure Erase
  1217.          Procedure ReName(NewName : FName)
  1218.          Procedure CopyTo(NewName : FName; NewPath: PName)
  1219.          Procedure Truncate
  1220.          Procedure Split(NewName: FName; NewPath: PName)
  1221.          Function EOF: Boolean
  1222.          Function Position: FPointer
  1223.          Function FileName: FName
  1224.          Function FilePath: PName
  1225.          Function FileSize: FPointer
  1226.    
  1227.        
  1228.    
  1229.                                ObjectBase Users Guide    Page  28   
  1230.    
  1231.    
  1232.        ---------------------------------------------------------------
  1233.        Name : DataFile
  1234.    
  1235.        Unit : DBObjt
  1236.    
  1237.        Parent : OopFile
  1238.    
  1239.        Description:
  1240.             DataFile is a child object of OopFile and knows how to 
  1241.             maintain itself as far as adding and deleting records 
  1242.             getting and putting specific records, etc. It is the 
  1243.             parent of both the IndexFile Object and the Dfile 
  1244.             Object.
  1245.    
  1246.        Method List:
  1247.    
  1248.          constructor Init(NewName:FName; NewPath:PName;
  1249.                           RecordSize :fPointer)
  1250.          Destructor Done; virtual
  1251.          Procedure Create;Virtual
  1252.          Procedure Open;Virtual
  1253.          Procedure Close;Virtual
  1254.          Procedure GetRec(RecNo: FPointer; Buff:pointer)
  1255.          Procedure PutRec(RecNo: FPointer; Buff:Pointer)
  1256.          Procedure NewRec(var RecNo: FPointer)
  1257.          Procedure AddRec(var RecNo: FPointer; Buff:Pointer)
  1258.          Procedure DeleteRec(RecNo: FPointer)
  1259.          Function UsedRecs:FPointer
  1260.          Function FileLen:Fpointer
  1261.    
  1262.        
  1263.    
  1264.                                ObjectBase Users Guide    Page  29   
  1265.    
  1266.    
  1267.        ---------------------------------------------------------------
  1268.        Name : IndexFile
  1269.    
  1270.        Unit : DBObjt
  1271.    
  1272.        Parent : DataFile
  1273.    
  1274.        Description :
  1275.             IndexFile is a datafile object that maintains a B+Tree 
  1276.             index.  The index keys must be strings and are limited to 
  1277.             50 characters in length. It can maintain an index of 
  1278.             either unique keys or recurring keys.  Key points to a 
  1279.             memory location that the index will use as its value 
  1280.             when passed a DataReference number.
  1281.    
  1282.        Method List:
  1283.    
  1284.          Constructor Init(NewFile : FName; NewPath: PName;
  1285.                           NewKeysize:integer;
  1286.                           NewData : Pointer; Dupsallowed:integer)
  1287.          Destructor Done;virtual
  1288.          Procedure Create;Virtual
  1289.          Procedure Open;Virtual
  1290.          Procedure Close;Virtual
  1291.          Procedure ClearKey
  1292.          Procedure NextKey(var ProcDataRef: FPointer)
  1293.          Procedure Nextkeystr(Var ProcDataRef: FPointer
  1294.                               Var ProcKey)
  1295.          Procedure PrevKey(var ProcDataRef: FPointer)
  1296.          Procedure PrevKeyStr(var ProcDataRef: FPointer;
  1297.                               Var ProcKey)
  1298.          Procedure FindKey(Var ProcDataRef: FPointer; Var ProcKey)
  1299.          Procedure SearchKey(Var ProcDataRef: FPointer; Var ProcKey)
  1300.          Procedure AddKey(Var ProcDataRef: FPointer)
  1301.          Procedure DelK(Var ProcdataRef: Fpointer)
  1302.          Procedure Top(var ProcDataRef: FPointer)
  1303.          Procedure Bottom(Var ProcDataRef: FPointer)
  1304.          Procedure savekey
  1305.          Procedure Destroy
  1306.          Function LastKey:string
  1307.          Function CheckKey:boolean
  1308.          Function ActiveKey: String
  1309.          Function EOIndex(RecNo:FPointer): Boolean
  1310.    
  1311.        
  1312.    
  1313.                                ObjectBase Users Guide    Page  30   
  1314.    
  1315.    
  1316.        ---------------------------------------------------------------
  1317.        Name : DFile 
  1318.    
  1319.        Unit : ObjtBase
  1320.    
  1321.        Parent : DataFile
  1322.    
  1323.        Description:
  1324.             DFile is a DataFile Object but is utilized by DB to 
  1325.             maintain not only the data records but also the index 
  1326.             maintenance chores.
  1327.    
  1328.        Method List:
  1329.    
  1330.          Constructor Init(F:Fname; Pth:PName; S : integer; P :Pointer)
  1331.          Destructor Done;Virtual
  1332.          Procedure Open;Virtual
  1333.          Procedure Create;Virtual
  1334.          Procedure Close;Virtual
  1335.          Procedure save
  1336.          Function IndexFileName : FName
  1337.          Procedure Next
  1338.          Procedure Prev
  1339.          Procedure Top
  1340.          Procedure Bottom
  1341.          Procedure LoadIndexFile(I :IFilePtr)
  1342.          Procedure Add
  1343.          Procedure DelR
  1344.          Procedure Get
  1345.          Procedure Put
  1346.          Procedure Find(S: String)
  1347.          Procedure Search(S:string)
  1348.          Procedure BlankRecord
  1349.          Procedure Clear
  1350.          Procedure SetIndex(i:fname)
  1351.          Procedure SetKeys
  1352.          Procedure CheckKeys
  1353.          Procedure reindex
  1354.          Function lastcode(I : FName): string
  1355.          Function ActiveKey : string
  1356.          Function EOFile: boolean
  1357.    
  1358.        
  1359.    
  1360.                                ObjectBase Users Guide    Page  31   
  1361.    
  1362.    
  1363.        ---------------------------------------------------------------
  1364.    GLOBAL VARIABLES
  1365.    
  1366.        IOstatus   : INTEGER
  1367.        OK         : Boolean
  1368.        FErrorCode : word
  1369.    
  1370.    GLOBAL FUNCTIONS
  1371.    
  1372.        Function NextCode(PrevCodeStr: String; L : integer): string
  1373.        Function Space(i : integer): string
  1374.        Function UpCaseStr(s:String):String
  1375.        Function Timestamp: LongInt
  1376.        
  1377.    
  1378.                                ObjectBase Users Guide    Page  32   
  1379.    
  1380.    
  1381.                       ORDER and REGESTRATION FORM
  1382.    
  1383.    Please return this form with your order or registration fee.
  1384.    
  1385.    Name:______________________________________________________
  1386.            last              first                mi
  1387.    
  1388.    Company:___________________________________________________
  1389.    
  1390.    Address:___________________________________________________
  1391.    
  1392.            ___________________________________________________
  1393.    
  1394.    City:_____________________________ St:______ Zip:__________
  1395.    
  1396.    Phone:(______)______-______________
  1397.    
  1398.    **** License Agreement ***************************************
  1399.    
  1400.    I would like to register the use of the ObjectBase Developers Toolbox 
  1401.    for use with Turbo Pascal v5.5.  In doing so I agree to abide by the 
  1402.    copyright laws of the United States.  I may use ObjectBase to develope 
  1403.    applications for sale or use to/by use of others without royalties but 
  1404.    I will not provide ObjectBase to other individuals or Companies for 
  1405.    their use in developement without express written consent of the 
  1406.    Author or his representative.  Furthermore I will not alter the 
  1407.    contents of the afore mentioned Software nor remove any Copyright 
  1408.    notices contained within it.
  1409.    
  1410.    Signature:___________________________________ Date: ____________
  1411.    
  1412.         Description                       Price      Qty   Inclosed
  1413.    ----------------------------------------------------------------
  1414.         ObjectBase Developers ToolBox ...@79.95 ea   ____ _________
  1415.    
  1416.         ObjectInterFace Dvlprs TlBx .....@79.95 ea   ____ _________
  1417.         
  1418.         SubTotal ...................................      _________
  1419.         
  1420.         Tax (if New York state resident) @ 7%             _________
  1421.         
  1422.         Total Inclosed (Check or MoneyOrder)........      _________
  1423.    
  1424.         Disk Size Required [_] 3.5"   [_] 5.25" (Check one)
  1425.    
  1426.    Product shipped at no charge within Continental United States.
  1427.    No COD's accepted.
  1428.    
  1429.    Return this form with Check or Money Order to:
  1430.    
  1431.                     Thomas W. Harden
  1432.                     Harden Consulting
  1433.                     48 Red Post Crescent
  1434.                     Fairport, NY  14450
  1435.